package com.csglxt.base;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import com.csglxt.domain.PageBean;
import com.csglxt.utils.QueryHelper;

/**
 * 
 * @ClassName: DaoSupportImpl
 * @Description: 基础数据库操作实现类
 * @author Delver_Si
 * @date 2015-5-11 下午10:30:10
 * 
 * @param <T>
 */
@SuppressWarnings("unchecked")
@Transactional
// 可被继承
public class DaoSupportImpl<T> implements DaoSupport<T> {

    @Resource
    private SessionFactory sessionFactory;
    private Class<T> clazz;

    public DaoSupportImpl() {
        // 使用反射技术得到T的真实类型
        ParameterizedType pt = (ParameterizedType) this.getClass()
                .getGenericSuperclass();// 获取当前对象的泛型的父类类型
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0];// 获取第一个类型参数的实际类型
        System.out.println("clazz  " + clazz);
    }

    /**
     * 获取当前可用的Session
     * 
     * @return
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public void save(T entity) {

        Session session = getSession();
        session.save(entity);

    }

    public void delete(String id) {
        Object obj = getById(id);
        if (obj != null) {
            getSession().delete(obj);
        }
    }

    public void update(T entity) {
        getSession().update(entity);

    }

    public T getById(String id) {
        if (id == null) {
            return null;
        } else {
            return (T) getSession().get(clazz, id);
        }
    }

    public List<T> getByIds(String[] ids) {
        if (ids == null || ids.length == 0) {
            return Collections.EMPTY_LIST; // 返回空集合，r而不是null，防止空指针
        }

        else {
            return getSession().createQuery(//
                    "FROM " + clazz.getSimpleName() + " WHERE id IN (:ids)")//
                    .setParameterList("ids", ids)//
                    .list();
        }
    }

    public List<T> findAll() {
        return getSession().createQuery(//
                "FROM " + clazz.getSimpleName())//
                .list();
    }

    // 公共的查询分页信息的方法
    @SuppressWarnings("rawtypes")
    public PageBean getPageBean(int pageNum, int pageSize,
            QueryHelper queryHelper) {
        System.out
                .println("-------> DaoSupportImpl.getPageBean( int pageNum, int pageSize, QueryHelper queryHelper )");

        // 参数列表
        List<Object> parameters = queryHelper.getParameters();

        // 查询本页的数据列表
        Query listQuery = getSession().createQuery(
                queryHelper.getListQueryHql()); // 创建查询对象
        if (parameters != null) { // 设置参数
            for (int i = 0; i < parameters.size(); i++) {
                listQuery.setParameter(i, parameters.get(i));
            }
        }
        listQuery.setFirstResult((pageNum - 1) * pageSize);
        listQuery.setMaxResults(pageSize);
        List list = listQuery.list(); // 执行查询

        // 查询总记录数量
        Query countQuery = getSession().createQuery(
                queryHelper.getCountQueryHql());
        if (parameters != null) { // 设置参数
            for (int i = 0; i < parameters.size(); i++) {
                countQuery.setParameter(i, parameters.get(i));
            }
        }
        Long count = (Long) countQuery.uniqueResult(); // 执行查询

        return new PageBean(pageNum, pageSize, count.intValue(), list);
    }

}
